# -*- coding: utf-8 -*-

from django.db import models
from django.db.models import Q
from django.contrib.auth.models import User, Group

# Create your models here.

class Campus(models.Model):
    class Meta:
        verbose_name_plural = "Campi"
    
    nome = models.CharField(u'Campus', max_length=50, default='', unique=True)
    
    def __unicode__(self):
        return self.nome
    
class Unidade(models.Model):
    class Meta:
        verbose_name_plural = "Unidades"
    
    nome = models.CharField(u'Unidade', max_length=100, default='', unique=False)
    campus = models.ForeignKey(Campus)
    
    def __unicode__(self):
        return self.campus.nome + ' - ' + self.nome

class Curso(models.Model):
    class Meta:
        verbose_name_plural = "Cursos"
    
    codigo = models.CharField(u'Código', max_length=3, unique=True)
    nome = models.CharField(u'Curso', max_length=100, default='', unique=False)
    campus = models.ForeignKey(Campus)
    
    def __unicode__(self):
        return self.campus.nome + ' - ('+ self.codigo + ') ' + self.nome

class Tipo_sala(models.Model):
    class Meta:
        verbose_name_plural = 'Tipos de sala'
    
    nome = models.CharField(u'Tipo de sala', max_length=100, default='', unique=True)
    
    def __unicode__(self):
        return self.nome

class Sala(models.Model):
    class Meta:
        verbose_name_plural = 'Salas'
    
    unidade = models.ForeignKey(Unidade)
    nome = models.CharField(u'Nome da sala', max_length=100, default='', unique=False)
    tipo_sala = models.ForeignKey(Tipo_sala)
    capacidade = models.IntegerField(default=0)
    material = models.TextField(null=True, blank=True)
    
    def __unicode__(self):
        return unicode(self.unidade.campus.nome) + ' - ' + unicode(self.unidade.nome) + ' - ' + self.nome

class Tipo_disciplina(models.Model):
    class Meta:
        verbose_name_plural = 'Tipos de disciplina'
    
    nome = models.CharField(u'Tipo de disciplina', max_length=100, default='', unique=True)
    
    def __unicode__(self):
        return self.nome

class Disciplina(models.Model):
    class Meta:
        verbose_name_plural = 'Disciplinas'
    
    codigo = models.CharField(u'Código', max_length=7, unique=True)
    nome = models.CharField(u'Disciplina', max_length=100, default='', unique=False)
    curso = models.ForeignKey(Curso)
    tipo_disciplina = models.ForeignKey(Tipo_disciplina)
    
    def save(self, *args, **kwargs):
        self.codigo = self.codigo.upper()
        super(Disciplina, self).save(*args, **kwargs)
    
    def __unicode__(self):
        return self.curso.nome + ' - ' + '(' + self.codigo + ') ' + self.nome + ' (' + self.tipo_disciplina.nome + ')'
    
class Semestre(models.Model):
    class Meta:
        verbose_name_plural = 'Semestres'
    
    semestre = models.CharField(u'Semestre', max_length=6)
    atual = models.IntegerField(u'Informe se este semestre é o atual', choices=((0, 'Não'), (1, 'Sim')))
    
    inicio = models.DateField(u'Data de início')
    fim = models.DateField(u'Data de término')
    
    def save(self, *args, **kwargs):
        if len(self.semestre) < 6:
            pass
        
        super(Semestre, self).save(*args, **kwargs)
    
    def __unicode__(self):
        return self.semestre

class Turma(models.Model):
    semestre = models.ForeignKey(Semestre)
    curso = models.ForeignKey(Curso)
    disciplina = models.ForeignKey(Disciplina)
    alunos = models.IntegerField('Número de alunos', default = 0)
    
    def __unicode__(self):
        return unicode(self.disciplina)
    
    def save(self, *args, **kwargs):
        if self.alunos < 0:
            self.alunos = 0
        super(Turma, self).save(args, kwargs)
    
class Evento(models.Model):
    semestre = models.ForeignKey(Semestre)
    nome = models.CharField(u'Nome do evento', max_length=200)
    descricao = models.TextField(u'Descreva o evento')
    responsavel = models.ForeignKey(User)
    
    def __unicode__(self):
        return self.nome + u' - Responsável: ' + unicode(self.responsavel)

class Ocupacao_Fixa(models.Model):
    class Meta:
        verbose_name_plural = 'Ocupações Fixas'
    
    dias_semana = (
        (0, u'Segunda-feira'),
        (1, u'Terça-feira'),
        (2, u'Quarta-feira'),
        (3, u'Quinta-feira'),
        (4, u'Sexta-feira'),
        (5, u'Sábado'),
        (6, u'Domingo'),
    )
    
    dia = models.IntegerField(u'Dia da semana', choices = dias_semana)
    
    horario_inicio = models.TimeField()
    horario_fim = models.TimeField()
    
    turma = models.ForeignKey(Turma, null = True, blank = True)
    evento = models.ForeignKey(Evento, null = True, blank = True)
    
    inicio = models.DateField(u'Data de início')
    fim = models.DateField(u'Data de término')
    sala = models.ForeignKey(Sala)
    
    def save(self, *args, **kwargs):
        if self.turma or self.evento:
            if self.turma:
                self.evento = None
                
        super(Ocupacao_Fixa, self).save(args, kwargs)
    
    def __unicode__(self):
        if self.turma:
            quem = self.turma
        elif self.evento:
            quem = self.evento
        else:
            quem = u'Não há turma ou evento associado'
            
        dia_semana = dict(self.dias_semana)[self.dia]
        
        return unicode(dia_semana) + ' - ' + unicode(self.horario_inicio) + u' às ' + unicode(self.horario_fim) + ' - ' + unicode(quem)
 
class Ocupacao_Variavel(models.Model):
    class Meta:
        verbose_name_plural = 'Ocupações Variáveis'
    
    dias_semana = (
        (0, 'Segunda-feira'),
        (1, 'Terça-feira'),
        (2, 'Quarta-feira'),
        (3, 'Quinta-feira'),
        (4, 'Sexta-feira'),
        (5, 'Sábado'),
        (6, 'Domingo'),
    )
    
    data = models.DateField(u'Data')
    
    horario_inicio = models.TimeField()
    horario_fim = models.TimeField()
    
    turma = models.ForeignKey(Turma, null = True, blank = True)
    evento = models.ForeignKey(Evento, null = True, blank = True)
    
    sala = models.ForeignKey(Sala)
    
    def save(self, *args, **kwargs):
        if (self.horario_fim <= self.horario_inicio):
            return
        
        ocupacao = Ocupacao_Fixa.objects.filter((Q(inicio__lte = self.data) & Q(fim__gt = self.data)))
        
        if ocupacao.count() > 0:
            ocupacao = ocupacao.filter(dia=self.data.weekday())
            
            if ocupacao.count() > 0:
                ocupacao = ocupacao.filter(Q(horario_inicio__gte = self.horario_inicio) & Q(horario_inicio__lt = self.horario_fim))
                
                if ocupacao.count() > 0:
                    ocupacao = ocupacao.filter(Q(horario_fim__gt = self.horario_inicio) & Q(horario_fim__lte = self.horario_fim))
                    
                    if ocupacao.count() > 0:
                        return

            
        if self.turma or self.evento:
            if self.turma:
                self.evento = None
                
        super(Ocupacao_Variavel, self).save(args, kwargs)
    
    def __unicode__(self):
        if self.turma:
            quem = self.turma
        elif self.evento:
            quem = self.evento
        else:
            quem = u'Não há turma ou evento associado'
        
        dia_semana = dict(self.dias_semana)[self.data.weekday()]
            
        return unicode(dia_semana) + ' - ' + unicode(self.horario_inicio) + u' às ' + unicode(self.horario_fim) + ' - ' + unicode(quem)

class Solicitacao(models.Model):
    class Meta:
        verbose_name_plural = 'Solicitações'
    
    usuario = models.ForeignKey(User)
    sala = models.ForeignKey(Sala)
    
    dia = models.DateField()
    
    horario_inicio = models.TimeField(u'Horário de início')
    horario_fim = models.TimeField(u'Horário de término')
    
    turma = models.ForeignKey(Turma, null = True, blank = True)
    evento = models.ForeignKey(Evento, null = True, blank = True)
    
    estado = models.IntegerField(u'Estado', choices = ((1, 'Aberta'), (0, 'Recusada'), (2, 'Aceita')), default = 1)
    
    def save(self, *args, **kwargs):
        if self.turma or self.evento:
            if self.turma:
                self.evento = None
                
        super(Solicitacao, self).save(args, kwargs)
    
    def __unicode__(self):
        return unicode(self.usuario) + u' - ' + unicode(self.dia) + u' - ('  + unicode(self.horario_inicio) + u' às ' + unicode(self.horario_fim) + u')'

class Aluno(models.Model):
        
    usuario = models.ForeignKey(User, null = True, blank = True)
    
    matricula = models.CharField(u'Número de matrícula', max_length=7, unique = True)

    ingresso = models.CharField(max_length=6, null = True, blank = True)
    
    matriculado = models.IntegerField(null = True, blank = True, choices = ((0, 'Não'), (1, 'Sim')))
    bolsista = models.IntegerField(null = True, blank = True, choices = ((0, 'Não'), (1, 'Sim')))

    def __unicode__(self):
#        return u'(' + self.matricula + u') ' + self.nome
        return self.matricula

class Funcionario(models.Model):
    class Meta:
        verbose_name_plural = 'Funcionários'
        
    usuario = models.ForeignKey(User, null = True, blank = True)
    matricula_siape = models.CharField(u'Número de matrícula', max_length=7, unique = True)
    
    def __unicode__(self):
        if self.usuario != None:
            return self.usuario.username
        return self.matricula_siape

class Professor(models.Model):
    class Meta:
        verbose_name_plural = 'Professores'
        
    funcionario = models.ForeignKey(Funcionario)
    ingresso = models.CharField(max_length=6, null = True, blank = True)
    de = models.IntegerField(u'Dedicação exclusiva?', null = True, blank = True, choices = ((0, 'Não'), (1, 'Sim')))
    
    def __unicode__(self):
        return self.funcionario

class Coordenador(models.Model):
    class Meta:
        verbose_name_plural = 'Coordenadores'
        
    professor = models.ForeignKey(Professor)
    
    inicio = models.DateField(null = True, blank = True)
    fim = models.DateField(null = True, blank = True)
    vice = models.IntegerField(null = True, blank = True, choices = ((0, 'Não'), (1, 'Sim')))
    
    def __unicode__(self):
        return self.professor

class Secretario(models.Model):
    class Meta:
        verbose_name_plural = 'Secretários'
        
    funcionario = models.ForeignKey(Funcionario)
    
    inicio = models.DateField(null = True, blank = True)
    fim = models.DateField(null = True, blank = True)
    
    def __unicode__(self):
        return unicode(self.funcionario)
    
